声明:博主写了一些Ambari系列文章,可以在历史文章中查看。

本文篇幅较长,但都是满满的干货。主要从Ambari-server详解、如何debug ambari-server源码、开发流程分析图、开发流程自定义示例四大部分入手,教读者如何玩转ambari-server

一、Ambari-server详解

1. 简介

Ambari-Server是一个WEB Server,提供统一的REST API接口,同时向web和agent开放了两个不同的端口(默认前者是8080, 后者是8440或者8441)。它是由Jetty Server容器构建,通过Spring Framework构建出来的WEB服务器,其中大量采用了google提供的Guice注解完成spring框架所需要的注入功能。 REST框架由JAX-RS标准来构建。

2. 目录

目录 描述
org.apache.ambari.server.api.services 对web接口的入口方法,处理/api/v1/* 的请求
org.apache.ambari.server.controller 对Ambari中cluster的管理处理,如新增host,更service、删除component等
org.apache.ambari.server.controller.internal 主要存放ResourceProvider和PropertyProvider;
org.apache.ambari.service.orm.* 对数据库的操作
org.apache.ambari.server.agent.rest 处理与Agent的接口的入口方法
org.apache.ambari.security 使用Spring Security来做权限管理

3. Resource

其中,每一种Resource都对应一个ResourceProvider,对应关系如下:

Resource.Type ResourceProvider
Workflow WorkflowResourceProvider
Job JobResourceProvider
TaskAttempt TaskAttemptResourceProvider
View ViewResourceProvider
ViewInstance ViewInstanceResourceProvider
Blueprint BlueprintResourceProvider
Cluster ClusterResourceProvider
Service ServiceResourceProvider
Component ComponentResourceProvider
Host HostResourceProvider
HostComponent HostComponentResourceProvider
Configuration ConfigurationResourceProvider
Action ActionResourceProvider
Request RequestResourceProvider
Task TaskResourceProvider
User UserResourceProvider
Stack StackResourceProvider
StackVersion StackVersionResourceProvider
StackService StackServiceResourceProvider
StackServiceComponent StackServiceComponentResourceProvider
StackConfiguration StackConfigurationResourceProvider
OperatingSystem OperatingSystemResourceProvider
Repository RepositoryResourceProvider
RootService RootServiceResourceProvider
RootServiceComponent RootServiceComponentResourceProvider
RootServiceHostComponent RootServiceHostComponentResourceProvider
ConfigGroup ConfigGroupResourceProvider
RequestSchedule RequestScheduleResourceProvider

我们对数据的处理就是在xxxResourceProvider.java内实现。

4. 获取数据流程

​ (1) jersy接口接收到请求,创建一个ResourceInstance实例;

​ (2) 解析http请求构造一个Request对象,然后交给reques的process()方法来处理;

​ (3) reques解析url或http_body得到一个Predicate对象;

​ (4) 根据http类型获取handler,GET请求对应ReadHandler;

​ (5) handler向Query对象中添加分页、Render、Predicate等属性后,然后让query.execute();

​ (6) 根据Resource.Type获得对应的ResourceProvider对象,调用其getResources方法得到Set\

​ (7) 调用对应的PropertyProvider填充Resource;

​ (8) 处理结果,返回json结果;

二、Ambari-server Debug模式

1. 停止ambari-server服务

1
ambari-server stop

2. 以debug的方式来启动ambari-server

1
java -server -Xdebug  -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=5005 -XX:NewRatio=3 -XX:+UseConcMarkSweepGC -XX:-UseGCOverheadLimit -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSClassUnloadingEnabled -Dsun.zip.disableMemoryMapping=true -Xms1012m -Xmx3048m -XX:MaxPermSize=256m -Djava.security.auth.login.config=/etc/ambari-server/conf/krb5JAASLogin.conf -Djava.security.krb5.conf=/etc/krb5.conf -Djavax.security.auth.useSubjectCredsOnly=false -cp /etc/ambari-server/conf:/usr/lib/ambari-server/*:/usr/share/java/mysql-connector-java-5.1.45-bin.jar     org.apache.ambari.server.controller.AmbariServer

如图所示:

3. 在IDEA中连接Ambari-Server

ambari-server默认配置了服务端的debug参数,端口为5005。如果要修改端口,可以在/usr/sbin/ambari_server_main.py文件中的对应位置修改,对应的ambari源码位置是ambari-server/src/main/python/ambari_server_main.py,直接改5005端口即可。代码如下:

1
2
3
4
5
6
7
8
9
SERVER_START_CMD_DEBUG = "{0} " \
"-server -XX:NewRatio=2 " \
"-XX:+UseConcMarkSweepGC " + \
"{1} {2} " \
" -Xdebug -Xrunjdwp:transport=dt_socket,address=5005," \
"server=y,suspend={6} " \
"-cp {3} " + \
"org.apache.ambari.server.controller.AmbariServer " \
"> {4} 2>&1 || echo $? > {5}"

在你要运行的代码上打上断点,比如,我要看http://172.16.0.142:8080/api/v1/users,就在user的代码某流程处打上断点:

点击debug按钮,在XShell内输入:curl -u admin:admin http://172.16.0.142:8080/api/v1/users

debug模式下,这几个按钮比较常用。从上往下,从左往右描述,分别为:一键断点处、断点概览、取消全部断点、平行执行、跳入执行、跳出执行等。

当一个流程走通时,如果要关闭debug模式,只需要Ctrl + c终止debug进程即可。这样ambari-server也就停掉了。

三、开发流程分析

以 GET /api/v1/users 为例进行。该接口用于获取所有用户。
资源请求类,一通百通。

1. 省略若干内容

1
2
3
4
...
由于商业价值,此处省略若干内容...
如需获取清洗流程图以及后续详细干货内容,可添加好友:create17_ 详聊。
...

9. REST API展示形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
href: "http://172.16.0.142:8080/api/v1/log/getAuditLog",
items: [
{
href: "http://172.16.0.142:8080/api/v1/log/getAuditLog/2",
auditlog: {
id: 2,
note: "2018-06-22T17:57:06.894-0700, User(admin), RemoteIp(172.16.0.167), Operation(User login), Roles( Ambari: 管理员 ), Status(Success)",
operation: "User login",
remoteIp: "172.16.0.167",
status: "Success",
time: "2018-06-22 17:57:06",
user: "admin"
}
},
{
href: "http://172.16.0.142:8080/api/v1/log/getAuditLog/1855",
auditlog: {
id: 1855,
note: "2018-07-12T18:51:00.846+0800, User(admin), RemoteIp(172.16.0.142), Operation(User login), Roles( Ambari: 管理员 ), Status(Success)",
operation: "User login",
remoteIp: "172.16.0.142",
status: "Success",
time: "2018-07-12 18:51:00",
user: "admin"
}
}
]
}

四、如何联系我

如需获取清洗流程图以及后续详细干货内容,可添加好友:create17_ 详聊。

Ambari 二次开发知识库地址:https://www.yuque.com/create17/ambari